<?php
/*
Author: Nicolas Zdanovicz
Date 20140325
User Data Access Class
*/
class DAOUsuario{

    public static function getById($id){
        
         $db = getPDO();
         $sql = "select * from usuario_web where id = ?";
         $stmt = $db->prepare($sql);
         $ok = $stmt->execute(array($id));
         $obj = $stmt->fetchObject();
         
         $usr = null;
         if($obj!=null){
             $usr= DAOUsuario::mapValues($obj);
         }
         else{
            throw new ENoDataFound("No se encontro el usuario con el id ".$id);
         }
         
         return $usr;
    }
    
    
    public static function getByDni($dni){
        
         $db = getPDO();
         $sql = "select * from usuario_web where dni = ?";
         $stmt = $db->prepare($sql);
         $ok = $stmt->execute(array($dni));
         $obj = $stmt->fetchObject();
         
         $usr = null;
         if($obj!=null){
             $usr= DAOUsuario::mapValues($obj);
         }
         else{
            throw new ENoDataFound("No se encontro el usuario con el dni ".$dni);
         }
         
         return $usr;
    }

    public static function getByDniApellidoNombre($dni,$apellido,$nombre){
    
    	$db = getPDO();
    	$sql = "select * from usuario_web where dni like concat('%',IFNULL(?,dni),'%') and apellido like concat('%',IFNULL(?,apellido),'%') and nombre like concat('%',IFNULL(?,nombre),'%')";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($dni,$apellido,$nombre));
    	
//     	$stmt->bind_param("sss",$dni,$apellido,$nombre);
    	$ok = $stmt->execute();
    	$result = $stmt->fetchAll(\PDO::FETCH_OBJ);
    	$arrResult = array();
    	
    	foreach($result as $row){
    		array_push($arrResult,DAOUsuario::mapValues($row));
    	}
    	 
    	return $arrResult;
    	
    	
    	
    }

    
        public static function getByFilter($filter){
    
    	$db = getPDO();
    	$sql = "select * from usuario_web where apellido LIKE '%".$filter."%' OR nombre LIKE '%".$filter."%' OR dni LIKE '%".$filter."%' ";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($filter));    	
    	$ok = $stmt->execute();
    	$result = $stmt->fetchAll(\PDO::FETCH_OBJ);
    	$arrResult = array();
    	
    	foreach($result as $row){
    		array_push($arrResult,DAOUsuario::mapValues($row));
    	}
    	return $arrResult;
    }

    public static function getUsersByClaseId($idClase){
    
    	$db = getPDO();
    	$sql = "select usr.*,uscl.presente from usuario_web usr join usuario_clase uscl on usr.id = uscl.id_usuario_web where uscl.id_clase = ?";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($idClase));
    	$ok = $stmt->execute();
    	$result = $stmt->fetchAll(\PDO::FETCH_OBJ);
    	$arrResult = array();
    	 
    	foreach($result as $row){
    		array_push($arrResult,DAOUsuario::mapValues($row));
    	}
    	return $arrResult;
    }
    
     
    public static function existeCorreo($correo){
        $existe = 'S';
        try{
            $usuario =DAOUsuario::getByEmail($correo);        
        }
        catch(ENoDataFound $e){
            $existe = 'N';
        }
        return $existe;
    }
    
    
    public static function getByEmail($email){
        
         $db = getPDO();
         $sql = "select * from usuario_web where email = ?";
         $stmt = $db->prepare($sql);
         $ok = $stmt->execute(array($email));
         $obj = $stmt->fetchObject();
         
         $usr = null;
         if($obj!=null){
             $usr= DAOUsuario::mapValuesForValidate($obj);
         }
         else{
            throw new ENoDataFound("No se encontro el usuario con el email ".$email);
         }
         
         return $usr;
    }
    
    public static function getAll(){
         
         $db = getPDO();
         $sql = "select * from usuario_web";
         $stmt = $db->prepare($sql);
         $ok = $stmt->execute();
         $result = $stmt->fetchAll(\PDO::FETCH_OBJ);
         $arrResult = array();    
        
         foreach($result as $row){             
             array_push($arrResult,DAOUsuario::mapValues($row));
         }
         
        return $arrResult;
    }
    
    
    
    
    
    public static function add($usuario){
        
         $db = getPDO();
          $sql = "insert into usuario_web (email, password,nombre, apellido, alta,activo,comentarios,recibe_mail,creditos,dni,telefono,libre) values ";
          $sql.= "(?,?,?,?,?,?,?,?,?,?,?,?)";
          $stmt = $db->prepare($sql);
          $ok = $stmt->execute(array($usuario->getEmail(),
                                     $usuario->getPassword(),
                                     $usuario->getNombre(),
                                     $usuario->getApellido(),
                                     $usuario->getAlta(),
                                     $usuario->getActivo(),
                                     $usuario->getComentarios(),
                                     $usuario->getRecibeMail(),
									 $usuario->getCreditos(),
          							 $usuario->getDni(),
          							 $usuario->getTelefono(),
          							 $usuario->getLibre()));
        
         
         $usuario->setId($db->lastInsertId());
        
         return $usuario;        
    }
    
    public static function updateCreditos($usuario){
    
    	$db = getPDO();
    	$sql = "update usuario_web set creditos = ? where id =?";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array(
    			$usuario->getCreditos(),
    			$usuario->getId()));
    	return $usuario;
    }
    
    
    public static function update($usuario){
    
    	$db = getPDO();
    	$sql = "update usuario_web set creditos = ?,email = ?, nombre = ?, apellido=?, dni=?,telefono=?,password=IFNULL(?,password),vencimiento_creditos = ?, libre=?,certificado = ? ,vencimiento_certificado=? where id =?";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array(
    			$usuario->getCreditos(),
    			$usuario->getEmail(),
    			$usuario->getNombre(),
    			$usuario->getApellido(),
    			$usuario->getDni(),
    			$usuario->getTelefono(),
    			$usuario->getPassword(),
    			$usuario->getVencimientoCreditos(),
    			$usuario->getLibre(),
    			$usuario->getCertificado(),
    			$usuario->getVencimientoCertificado(),
    			$usuario->getId()));
    	return;
    }
    
    private static function mapValuesForValidate($obj){
			$usr = DAOUsuario::mapValues($obj);
			$usr->setPassword($obj->password);
			return $usr;			
    	}
    	
    private static function mapValues($obj){
        $usr = new Usuario();
        $usr->setId($obj->id);
        $usr->setApellido($obj->apellido);
        
        $usr->setNombre($obj->nombre);
        $usr->setEmail($obj->email);
        $usr->setAlta(date("d/m/Y H:i",strtotime($obj->alta)));
        $usr->setActivo($obj->activo);
        $usr->setComentarios($obj->comentarios);
        $usr->setBaja($obj->baja);
        $usr->setMotivoBaja($obj->motivo_baja);
        $usr->setRecibeMail($obj->recibe_mail);
		$usr->setCreditos($obj->creditos);
		$usr->setDni($obj->dni);
		$usr->setApellido($obj->apellido);
		$usr->setTelefono($obj->telefono);
		if($obj->vencimiento_creditos != null){
			$usr->setVencimientoCreditos($obj->vencimiento_creditos);
			$usr->setVencimientoCreditosStr(DateUtils::formatToLocalDate($obj->vencimiento_creditos));
		}
		$usr->setCertificado($obj->certificado);
		if($obj->vencimiento_certificado != null){
			$usr->setVencimientoCertificado($obj->vencimiento_certificado);
			$usr->setVencimientoCertificadoStr(DateUtils::formatToLocalDate($obj->vencimiento_certificado));
		}
		if(isset($obj->presente)){
			$usr->setPresente($obj->presente);
		}
		if(isset($obj->vencimiento_creditos)){
			$usr->setCreditosVencidos(DateUtils::compareWithNow($obj->vencimiento_creditos));
		}
		$usr->setLibre($obj->libre);
		return $usr;
    }
    
}
?>